前幾天大概說明了NN的概念,今天就用python來實現一下~我主要是使用Colab來執行,因為在Colab上安裝Tensorflow& Keras很間單,還有Colab有提供免費GPU(我記得使用的時間是12個小時左右)!今天的dataset是一個keras內建資料庫-fashion_mnist,裡面有很多不同服飾的灰度圖(28x28),我們來訓練一個模型判斷照片內容物是什麼。
Tensorflow& Keras的關係可以想成主程式與介面,keras是讓Tensorflow寫起來更容易的使用方式
import tensorflow as tf
from tensorflow import keras
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fashion_mnist = keras.datasets.fashion_mnist
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
X_train = X_train / 255.0 #為了顯示圖像對資料進行預處理
X_test = X_test / 255.0 #為了顯示圖像對資料進行預處理
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
開始建模型,主要可以自己決定要幾層layer,每一層node要多少個,non-linear要使用哪一種,有點像在疊樂高一樣,但記得因為是多分類問題,所以最後要加一層softmax,然後架構就大致建好了,最後的組裝是要決定整個架構要用哪一種loss function以及要用哪種metrics來衡量,我們這邊loss function使用分類問題常見的crossentropy,metrics就是accuracy。
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(50, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))
print(model.summary())
model.compile(loss="sparse_categorical_crossentropy", optimizer="Adam", metrics=["accuracy"])
訓練模型~
history = model.fit(X_train, y_train, epochs=20, validation_split=0.1)
來看一下模型結果
pd.DataFrame(history.history).plot(figsize=(8, 5))
fit test
model.evaluate(X_test, y_test)
隨機找個圖片預測一下:
import random
img = X_test[random.randint(0,9999),:,:]
plt.imshow(img)
X_new = np.expand_dims(img, axis=0)
model.predict(X_new).round(2)
y_pred = model.predict_classes(X_new)
class_names[int(y_pred)]
[reference]
https://www.tensorflow.org/datasets/catalog/fashion_mnist
https://blog.csdn.net/sdlyjzh/article/details/8245145
https://www.tensorflow.org/api_docs/python/tf/keras/Model